package com.shg.service.impl;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.stereotype.Service;

import com.shg.bean.Admin;
import com.shg.bean.Power;
import com.shg.bean.QueryResult;
import com.shg.bean.Roles;
import com.shg.service.PowerService;

@Service
public class PowerServiceBean extends BasiceDaoImpl<Power> implements PowerService {

	/**
	 * 获取权限列表
	 * @param admin登录的用户
	 */
	 public  Map<String, Set<Power>> getPower(Admin admin){
		 Map<String, Set<Power>> map=new HashMap<String, Set<Power>>();
		 
		 Admin login = (Admin) sessionFactory.getCurrentSession().get(Admin.class, admin.getId());
		 if(login.getRole()!=null){
			 //查询该用户所有关联的权限
			 Iterator<Power> iterator=login.getRole().getPower().iterator();
			 //对查询出来的权限进行分组
			 while(iterator.hasNext()){
				 Power power=iterator.next();
				 //获取该权限所属父类
				 Power parent = (Power) sessionFactory.getCurrentSession().createQuery("from Power where id="+power.getParent()).list().get(0);
				 //变量map集合里面是否存在该父类
				 if(map.containsKey(parent.getName())){
					 //如果存在
					Set<Power> powers=map.get(parent.getName());
					powers.add(power);
					map.put(parent.getName(), powers);
				 }else{
					 //如果不存在
					 Set<Power> set=new HashSet<Power>();
					 set.add(power);
					 map.put(parent.getName(), set);
				 }
			 }
		 }
		return map;
	 }
	 /**
	  * 分页查询所有的权限列表
	  * @param firstResult 查询的其实位置
	  * @param maxResult 每页显示的最大记录数
	  * @return
	  */
	 public QueryResult<Power> getAllPower(Integer firstResult,Integer maxResult){
		 LinkedHashMap<String, String> orderby=new LinkedHashMap<String, String>();
		 orderby.put("id", "asc");
		 QueryResult<Power> result = getPagination(Power.class, firstResult, maxResult, orderby);
		 return result;
	 }
	 /**
	  * 添加权限
	  * @param power
	  */
	 public void addPower(Power power){
		 sessionFactory.getCurrentSession().save(power);
	 }
	 /**
	  * 更新权限
	  */
	 public void updatePower(Power power){ 
		String sql="update Power set state="+power.getState()
		+",name='"+power.getName()+"',remarks='"+power.getRemarks()
		+"',url='"+power.getUrl()+"' where id="+power.getId();
	 sessionFactory.getCurrentSession().createSQLQuery(sql).executeUpdate();
		 
		 //sessionFactory.getCurrentSession().update(power);
	 }
	 /**
	  * 权限解锁
	  */
	 public void updateUnlock(Integer state,long id){
		 String sql="update Power set state="+state+" where id="+id;
		 sessionFactory.getCurrentSession().createSQLQuery(sql).executeUpdate();
	 }
	 /**
	  * 查询指定权限下的角色
	  * @param id 权限ID
	  * @param type 1:表示查询权限所属角色 2：表示不属于该权限的角色
	  */
	@SuppressWarnings("unchecked")
	public List<Roles> getPowerForRole(long powerid){
		 //查询指定某个权限关联的角色的id
		 String sql="select role_id from role_power where power_id="+powerid;
		 List<BigInteger> roleID=sessionFactory.getCurrentSession().createSQLQuery(sql).list();
		 //查询所有的角色
		 sql="from Roles where state=1";
		 List<Roles> list = sessionFactory.getCurrentSession().createQuery(sql).list();
		 for(BigInteger roleid:roleID){
			 for(Roles role:list){
				 if(role.getId()==roleid.longValue()){
					 role.setCheck(true);
					 break;
				 }
			 }
		 }
		 return list;
	 }
	/**
	 * 更新权限的角色
	 */
	public void updatePowerForRole(Power power, long[] roleid) {
		//删除该权限下的所有角色
		String sql="delete from role_power where power_id="+power.getId();
		sessionFactory.getCurrentSession().createSQLQuery(sql).executeUpdate();
		if(roleid!=null){
			for(long id:roleid){
				sql="insert into role_power(role_id,power_id) values("+id+","+power.getId()+")";
				sessionFactory.getCurrentSession().createSQLQuery(sql).executeUpdate();
			}
		}
	}
	/**
	 * 获取权限的父类
	 */
	public List<Power> getParent() throws Exception {
		String sql="from Power where parent=0";
		List<Power> list = sessionFactory.getCurrentSession().createQuery(sql).list();
		return list;
	}
}
